package cn.tiger.controller;

import cn.tiger.common.Result;
import cn.tiger.pojo.dto.LoginRequest;
import cn.tiger.pojo.dto.RegisterRequest;
import cn.tiger.pojo.vo.LoginResponse;
import cn.tiger.service.AuthService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import jakarta.validation.Valid;

/**
 * 认证控制器
 * 
 * 提供用户认证相关的REST API接口，包括用户登录和注册功能
 * 使用Spring Boot 3.4.9框架和JWT令牌进行身份验证
 * 
 * @author AI Backend Team
 * @version 1.0
 * @since 2025-09-26
 */
@Slf4j // 启用Lombok日志功能，自动生成log字段
@RestController // 标识这是一个REST控制器，自动将返回值序列化为JSON
@RequestMapping("/api/auth") // 定义控制器的基础URL路径
@RequiredArgsConstructor // Lombok注解，为final字段生成构造函数
@Validated // 启用参数校验功能
@Tag(name = "认证管理", description = "用户登录、注册相关接口") // Swagger文档标签
public class AuthController {
    
    /** 
     * 认证服务层依赖注入
     * 提供用户登录、注册等认证相关的业务逻辑处理
     */
    private final AuthService authService;
    
    /**
     * 用户登录接口
     * 
     * 接收用户登录请求，验证用户名和密码，成功后返回JWT令牌
     * 支持参数校验，异常处理和日志记录
     * 
     * @param request 登录请求参数，包含用户名和密码
     * @return 返回统一响应格式，成功时包含用户信息和JWT令牌
     */
    @Operation(summary = "用户登录", description = "用户通过用户名和密码登录") // Swagger接口文档注解
    @ApiResponses(value = {
            @ApiResponse(responseCode = "200", description = "登录成功"),
            @ApiResponse(responseCode = "401", description = "用户名或密码错误"),
            @ApiResponse(responseCode = "500", description = "系统异常")
    }) // Swagger响应状态文档
    @PostMapping("/login") // 定义POST请求映射路径
    public Result<LoginResponse> login(@Valid @RequestBody LoginRequest request) {
        try {
            // 调用认证服务处理登录逻辑
            LoginResponse response = authService.login(request);
            // 返回成功响应
            return Result.success("登录成功", response);
        } catch (Exception e) {
            // 记录错误日志
            log.error("登录失败", e);
            // 返回默认错误响应
            return Result.defaultError();
        }
    }
    
    /**
     * 用户注册接口
     * 
     * 接收用户注册请求，创建新用户账户，成功后自动登录并返回JWT令牌
     * 支持参数校验、用户名重复检查、异常处理和日志记录
     * 
     * @param request 注册请求参数，包含用户名、密码等信息
     * @return 返回统一响应格式，成功时包含用户信息和JWT令牌
     */
    @Operation(summary = "用户注册", description = "新用户注册") // Swagger接口文档注解
    @ApiResponses(value = {
            @ApiResponse(responseCode = "200", description = "注册成功"),
            @ApiResponse(responseCode = "400", description = "用户名已存在"),
            @ApiResponse(responseCode = "500", description = "系统异常")
    }) // Swagger响应状态文档
    @PostMapping("/register") // 定义POST请求映射路径
    public Result<LoginResponse> register(@Valid @RequestBody RegisterRequest request) {
        try {
            // 调用认证服务处理注册逻辑
            LoginResponse response = authService.register(request);
            // 返回成功响应
            return Result.success("注册成功", response);
        } catch (Exception e) {
            // 记录错误日志
            log.error("注册失败", e);
            // 返回默认错误响应
            return Result.defaultError();
        }
    }
}
